#include <LotipagoConfiguration.h>

LotipagoConfiguration::LotipagoConfiguration()
{
	m_IdMessage = 0x00;
	m_Transaccion = 0x00;
	m_ErrorCode = 0;
	memset( m_IdTransaction , 0x00 , SIZE_ID_TRANSACTION );
	m_Dia = 0x00;
	m_Mes = 0x00;
	m_Anio = 0x0000;
	m_Hora = 0x00;
	m_Minutos = 0x00;
	m_Segundos = 0x00;
	m_SubTransact = 0x00; 
	m_CodMsg = 0x0000;
	m_IdError = 0x00000000;
	m_NumTerminal = 0x00000000;
	m_VentasOnLine = 0x00;
	m_VentasOffLine = 0x00;
	m_Reimpresion = 0x00;
	m_Anulacion = 0x00;
	m_Miniticket = 0x00;
	m_ControlDeVto = 0x00;
	m_LimiteTiempoAnul = 0x00;
	m_CantServInhab = 0x00;
}

LotipagoConfiguration::~LotipagoConfiguration()
{
}


void LotipagoConfiguration::deserialize( QByteArray data )
{
	BMMemoryUtils memUtil;
	unsigned int bytesCopied = 0;
	
	unsigned char * buff = (unsigned char *) malloc( data.size() );
	memset( buff , '\0' , data.size() );

	for (short i = 0; i < data.size() ; i++ )
		buff[i] = data.at(i);

	// id de mensaje de respuesta de pedido de sorteo (0x51)
	memUtil.MemoryCopy( &m_IdMessage , buff , sizeof( m_IdMessage ) );
	bytesCopied += sizeof( m_IdMessage );

	// Transaccion (0xd1)
	memUtil.MemoryCopy( &m_Transaccion , buff + bytesCopied, sizeof( m_Transaccion) );
	bytesCopied += sizeof( m_Transaccion );

	// codigo de error
	memUtil.MemoryCopy( &m_ErrorCode , buff + bytesCopied , sizeof( m_ErrorCode ) );
	bytesCopied += sizeof( m_ErrorCode );

	// Controlo si hay error
	if ( m_ErrorCode == 0 )
	{
		// id de transaccion
		memUtil.MemoryCopy( &m_IdTransaction , buff + bytesCopied , SIZE_ID_TRANSACTION , BIG_ENDIAN );
		bytesCopied += SIZE_ID_TRANSACTION;

		// dia
		memUtil.MemoryCopy( &m_Dia , buff + bytesCopied , sizeof( m_Dia ) ); 
		bytesCopied += sizeof( m_Dia );
	
		// mes
		memUtil.MemoryCopy( &m_Mes , buff + bytesCopied , sizeof( m_Mes ) ); 
		bytesCopied += sizeof( m_Mes );

		// anio
		memUtil.MemoryCopy( &m_Anio , buff + bytesCopied , sizeof( m_Anio ) ); 
		bytesCopied += sizeof( m_Anio );

		// hora
		memUtil.MemoryCopy( &m_Hora , buff + bytesCopied , sizeof( m_Hora ) ); 
		bytesCopied += sizeof( m_Hora );

		// minutos
		memUtil.MemoryCopy( &m_Minutos , buff + bytesCopied, sizeof( m_Minutos ) ); 
		bytesCopied += sizeof( m_Minutos );

		// segundos
		memUtil.MemoryCopy( &m_Segundos , buff + bytesCopied, sizeof( m_Segundos ) ); 
		bytesCopied += sizeof( m_Segundos );
	
		// subtransaccion
		memUtil.MemoryCopy( &m_SubTransact , buff + bytesCopied , sizeof( m_SubTransact ) ); 
		bytesCopied += sizeof( m_SubTransact );

		// Estado de empresa
		memUtil.MemoryCopy( &m_CodMsg , buff + bytesCopied , sizeof( m_CodMsg ) ); 
		bytesCopied += sizeof( m_CodMsg );

		// Id de error
		memUtil.MemoryCopy( &m_IdError , buff + bytesCopied , sizeof( m_IdError ) ); 
		bytesCopied += sizeof( m_IdError );

		// Numero de terminal
		memUtil.MemoryCopy( &m_NumTerminal , buff + bytesCopied , sizeof( m_NumTerminal ) ); 
		bytesCopied += sizeof( m_NumTerminal );
	
		// Ventas On Line
		memUtil.MemoryCopy( &m_VentasOnLine , buff + bytesCopied , sizeof( m_VentasOnLine ) ); 
		bytesCopied += sizeof( m_VentasOnLine );

		// Ventas Off Line
		memUtil.MemoryCopy( &m_VentasOffLine , buff + bytesCopied , sizeof( m_VentasOffLine ) ); 
		bytesCopied += sizeof( m_VentasOffLine );

		// Reimpresion
		memUtil.MemoryCopy( &m_Reimpresion , buff + bytesCopied , sizeof( m_Reimpresion ) ); 
		bytesCopied += sizeof( m_Reimpresion );

		// Anulacion
		memUtil.MemoryCopy( &m_Anulacion , buff + bytesCopied , sizeof( m_Anulacion ) ); 
		bytesCopied += sizeof( m_Anulacion );

		// Miniticket
		memUtil.MemoryCopy( &m_Miniticket , buff + bytesCopied , sizeof( m_Miniticket ) ); 
		bytesCopied += sizeof( m_Miniticket );

		// Ventas Off Line
		memUtil.MemoryCopy( &m_ControlDeVto , buff + bytesCopied , sizeof( m_ControlDeVto ) ); 
		bytesCopied += sizeof( m_ControlDeVto );

		// Limite de anulacion
		memUtil.MemoryCopy( &m_LimiteTiempoAnul , buff + bytesCopied , sizeof( m_LimiteTiempoAnul ) ); 
		bytesCopied += sizeof( m_LimiteTiempoAnul );

		// Cantidad de sevicios inhabilitados
		memUtil.MemoryCopy( &m_CantServInhab , buff + bytesCopied , sizeof( m_CantServInhab ) ); 
		bytesCopied += sizeof( m_CantServInhab );

		for ( int i = 0 ; i < m_CantServInhab ; i++ )
		{
			unsigned short codServ;
			memUtil.MemoryCopy( &codServ , buff + bytesCopied , sizeof( codServ ) );
			bytesCopied += sizeof( codServ );

			m_ListCodServDeshab.append( codServ );
		}
	}
	else
	{
		// obtengo decripcion del error
		char descripcion[512];
		memset( descripcion , '\0' , 512 );
		
		// bytes de relleno del protocolo
		int relleno = 5;

		memUtil.MemoryCopy( descripcion , buff + bytesCopied + relleno , data.size() - bytesCopied - relleno , BIG_ENDIAN );
		// el relleno lo ignoro, pero debo contarlo como copiado para saber hasta donde lei del buffer
		bytesCopied += data.size() - bytesCopied; 
		m_ErrorDescription = descripcion;
	}
}


void LotipagoConfiguration::save()
{

}

void LotipagoConfiguration::update( QByteArray data )
{

}